clc
clear

%*******************************从iris.data文件中读取数据**********************
[filename,filepath]=uigetfile('*.data','导入iris数据库');
file=[filepath filename];
fid=fopen(file);
if fid ~=-1
    disp('打开数据文件成功！');
end
if fid==-1
    disp('打开数据文件出错！');
end
%****************************读取文件中的属性数据放入数组iris中*****************
%其中一个数组元是由一个四个数据组成的小数组，即一个样本的四个属性
lineNumber=1;
while 1
    dataLine = fgetl(fid);
    if ~ischar(dataLine)
        break;
    end
    irisData{lineNumber} = sscanf(dataLine,'%f,%f,%f,%f');
    lineNumber=lineNumber+1;
end
%类标签
for i=1:150
    if i<=50
        y(i)=-1;
    else if (i<=100)
            y(i)=0;
        else
            y(i)=1;
        end
    end
end
name='Iris Data Set';
for i=1:150
    sample=irisData{i};
    for j=1:4
        X(:,i)=sample;
    end
end
disp(X);
save('iris1.mat','X','y','name');
load iris1.mat;  %载入iris文本数据
%************************重新载入数据，进行分类*********************************
load iris1.mat;  
X=X';%数据集
y=y';%类标号集
%70%作为训练集
trainset=[X(1:35,:);X(51:85,:);X(101:135,:)];
trainsetlabel=[y(1:35,:);y(51:85,:);y(101:135,:)];
%30%作为测试集
testdata=[X(36:50,:);X(86:100,:);X(136:150,:)];
testlabel=[y(36:50,:);y(86:100,:);y(136:150,:)];

for n=1:30 %迭代30次比较两种方法
    for k=1:10 %跑十次SVM
         train_num=randint(105,1,[1 105]);%随机产生随机抽取从1到150的105个整数编号，作为要抽取的训练集的标号
         for i=1:105
             traindata(i,:)=trainset(train_num(i),:);
             trainlabel(i,:)=trainsetlabel(train_num(i));
         end
         model=svmtrain(trainlabel,traindata);
         [predicted_label(:,k),accuracy,decision_value]=svmpredict(testlabel,testdata,model);
    end
    acc_rf(n)=random_forest(predicted_label,testlabel);
    acc_ada(n)=adaboost(predicted_label,testlabel);
end
acc_rf=acc_rf';
acc_ada=acc_ada';
xlswrite('accuracy_randdom_forest',acc_rf);
xlswrite('accuracy_adaboost',acc_ada);